"""
@Author : 合肥一元数智教育科技有限公司
@Date :  2025/6/3 10:47
@Description :  装饰器的使用
装饰器也可以修饰类   修饰类时 会将类作为参数传入装饰器
"""
"""
需求:
  1. 通过class Dog创建的实例 是同一个    单例模式

解决方案:
   1. 使用类中的魔术方法  __init__  __new__
   2. 装饰器   缓存数据  区分度  字典 dict   {cls:obj}  {Dog:obj,Cat:obj}
"""

# 单例模式的装饰器
def singleton(cls):
    # 缓存数据
    instances = {}

    def inner():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return inner


@singleton
class Dog:
    pass


@singleton
class Cat:
    pass


if __name__ == '__main__':
    """
    dog = Dog()
    print(id(dog))
    dog2 = Dog()
    print(id(dog2))
    """
    cat1 = Cat()
    print(id(cat1))
    cat2 = Cat()
    print(id(cat2))
